import sys
import os
sys.path.insert(0, os.path.abspath('../'))
sys.path.insert(0, os.path.abspath('../../'))
import qiskit
provider = qiskit.IBMQ.load_account()
import optuna
from qiskit import Aer
from qiskit.utils import QuantumInstance
from qiskit_optimization.algorithms import WarmStartQAOAOptimizer, CobylaOptimizer, MinimumEigenOptimizer, SlsqpOptimizer
from qiskit.algorithms import QAOA
from shared.QiskitMaxcut import *
from ibm.ibm_parameters import *
%matplotlib inline
print_parameters()
Optimizers: ['SPSA', 'QN-SPSA', 'COBYLA'] with MaxIter of 5 Number of shots: 8000 Repetitions: [ 1; 5 ] Gamma value interval: [ -3.141592653589793; 3.141592653589793 ] Beta value interval: [ 3.141592653589793;-3.141592653589793 ] Number of Optuna Trials: 5 Noise Backend Name: ibmq_toronto
# ---- Define graph and MaxCut ----
graph = load_graph()
max_cut = Maxcut(graph)
max_cut_qubo = max_cut.to_qubo()
max_cut.draw()
def init_qaoa(optimizer, reps, init_parameters):
quantum_instance = QuantumInstance(
backend=Aer.get_backend(DEFAULT_QASM_SIMULATOR),
shots=SHOTS)
if optimizer == "QN-SPSA":
# generate QAOA to get ansatz
pre_qaoa = QAOA(optimizer=COBYLA(maxiter=1, tol=0), quantum_instance=quantum_instance, reps=reps, initial_point=init_parameters)
MinimumEigenOptimizer(pre_qaoa).solve(max_cut_qubo)
fidelity = QNSPSA.get_fidelity(pre_qaoa.ansatz)
optimizer = QNSPSA(fidelity, maxiter=MAX_ITER)
qaoa = QAOA(optimizer=optimizer, quantum_instance=quantum_instance, reps=reps,
initial_point=init_parameters)
ws_qaoa = WarmStartQAOAOptimizer(pre_solver=SlsqpOptimizer(), relax_for_pre_solver=True,
qaoa=qaoa)
return ws_qaoa
def run(max_cut_problem, qaoa):
# Run quantum algorithm QAOA
result = qaoa.solve(max_cut_problem)
optimal_parameters = qaoa._qaoa.optimal_params
return result, optimal_parameters.copy()
def objective(trial):
optimizer_name = trial.suggest_categorical("optimizer", optimizers.keys())
reps = trial.suggest_int('reps', REPS_MIN, REPS_MAX + 1)
parameters = []
for i in range(reps):
parameters.append(trial.suggest_uniform(f'gamma_{i}', GAMMA_MIN, GAMMA_MAX))
for i in range(reps):
parameters.append(trial.suggest_uniform(f'beta_{i}', BETA_MIN, BETA_MAX))
optimizer = optimizers[optimizer_name]
qaoa = init_qaoa(optimizer, reps, parameters)
result, optimal_parameters = run(max_cut_qubo, qaoa)
mean, distribution = max_cut.analyse(result)
trial.set_user_attr(key="best", value=[mean,result,optimal_parameters, optimizer_name])
return mean
study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=N_TRIALS, callbacks=[save_best_trial])
[I 2021-08-09 09:50:11,672] A new study created in memory with name: no-name-004441aa-b3cf-44d0-ae16-bde782fa9d65 [I 2021-08-09 10:13:57,130] Trial 0 finished with value: -88.63675000000134 and parameters: {'optimizer': 'QN-SPSA', 'reps': 5, 'gamma_0': 2.02191949553369, 'gamma_1': 0.9632366860602266, 'gamma_2': 0.3963933135146642, 'gamma_3': -3.079108408677299, 'gamma_4': -0.6327429174160422, 'beta_0': -0.48404485220885496, 'beta_1': -2.492225080469951, 'beta_2': 1.869228829989555, 'beta_3': 2.202949975881771, 'beta_4': -0.7281017827554304}. Best is trial 0 with value: -88.63675000000134. [I 2021-08-09 10:25:22,596] Trial 1 finished with value: -89.06862500000061 and parameters: {'optimizer': 'SPSA', 'reps': 4, 'gamma_0': -1.2388912775688612, 'gamma_1': -0.8618435823076642, 'gamma_2': 2.3107492834283674, 'gamma_3': 2.5003035310526265, 'beta_0': 2.7467780861315534, 'beta_1': -1.028977859681242, 'beta_2': -1.1071796052095229, 'beta_3': 0.7283283912022771}. Best is trial 1 with value: -89.06862500000061. [I 2021-08-09 10:25:55,268] Trial 2 finished with value: -89.35225000000045 and parameters: {'optimizer': 'COBYLA', 'reps': 5, 'gamma_0': 2.989618283093355, 'gamma_1': 2.1393732408382853, 'gamma_2': -1.3476279173046661, 'gamma_3': -0.8912075694861086, 'gamma_4': -1.475658461720653, 'beta_0': -2.59186537457484, 'beta_1': -1.321887468531628, 'beta_2': -3.124829798771131, 'beta_3': -0.15882218593784048, 'beta_4': 0.6367093235650088}. Best is trial 2 with value: -89.35225000000045. [I 2021-08-09 10:44:26,763] Trial 3 finished with value: -99.51012500000112 and parameters: {'optimizer': 'QN-SPSA', 'reps': 3, 'gamma_0': -1.6927705179176098, 'gamma_1': -0.7743629075525513, 'gamma_2': 1.5356136697936158, 'beta_0': 2.0114565407124205, 'beta_1': 0.5213801556204891, 'beta_2': 2.3580202441075055}. Best is trial 3 with value: -99.51012500000112. [I 2021-08-09 10:58:26,759] Trial 4 finished with value: -88.19412500000077 and parameters: {'optimizer': 'SPSA', 'reps': 4, 'gamma_0': -1.6832964461597693, 'gamma_1': 2.2890284993745693, 'gamma_2': -0.841127592907009, 'gamma_3': -2.570019581238393, 'beta_0': 2.1493550154304755, 'beta_1': 2.795357271082888, 'beta_2': -2.8918318583056135, 'beta_3': 2.3726342905120363}. Best is trial 3 with value: -99.51012500000112.
print(study.best_trial)
FrozenTrial(number=3, values=[-99.51012500000112], datetime_start=datetime.datetime(2021, 8, 9, 10, 25, 55, 686968), datetime_complete=datetime.datetime(2021, 8, 9, 10, 44, 25, 259417), params={'optimizer': 'QN-SPSA', 'reps': 3, 'gamma_0': -1.6927705179176098, 'gamma_1': -0.7743629075525513, 'gamma_2': 1.5356136697936158, 'beta_0': 2.0114565407124205, 'beta_1': 0.5213801556204891, 'beta_2': 2.3580202441075055}, distributions={'optimizer': CategoricalDistribution(choices=('SPSA', 'QN-SPSA', 'COBYLA')), 'reps': IntUniformDistribution(high=6, low=1, step=1), 'gamma_0': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_1': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_2': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_0': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_1': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_2': UniformDistribution(high=3.141592653589793, low=-3.141592653589793)}, user_attrs={'best': [-99.51012500000112, optimal function value: -177.0
optimal value: [0. 0. 0. 0. 1. 1. 1. 1. 1. 1. 1. 1. 0. 0. 0. 0.]
status: SUCCESS, array([-0.38814648, 3.25712267, 2.84286883, 3.89442063, 1.82863531,
0.47242504]), 'QN-SPSA']}, system_attrs={}, intermediate_values={}, trial_id=3, state=TrialState.COMPLETE, value=None)
fig = optuna.visualization.plot_optimization_history(study)
fig.show()
mean, result, optimal_params, optimizer_name = study.user_attrs["best"]
print(f"Optimizer: {optimizer_name}")
print(f"Optimal Parameters: {optimal_params}")
Optimizer: QN-SPSA Optimal Parameters: [-0.38814648 3.25712267 2.84286883 3.89442063 1.82863531 0.47242504]
max_cut.draw(result)
mean, distribution = max_cut.analyse(result, print_output=True)
max_cut.plot_histogram(distribution, mean)
optimal function value: -177.0 optimal value: [0. 0. 0. 0. 1. 1. 1. 1. 1. 1. 1. 1. 0. 0. 0. 0.] status: SUCCESS Number of samples (6184) is too large to display. Skip. Expectation Value: -99.51012500000112 Highest Exp.Value: -27 with 0.000125 % Lowest Exp.Value: -177 with 0.001125 % Highest Probability: -93 with 0.02875 % Ratio r: 0.48340083333334083 MSE: 1390.4641775156263 RMSE: 37.28892835032439
import qiskit.tools.jupyter
%qiskit_version_table
/home/hm-tlacherm/.local/lib/python3.8/site-packages/qiskit/aqua/__init__.py:86: DeprecationWarning: The package qiskit.aqua is deprecated. It was moved/refactored to qiskit-terra For more information see <https://github.com/Qiskit/qiskit-aqua/blob/main/README.md#migration-guide>
| Qiskit Software | Version |
|---|---|
qiskit-terra | 0.18.1 |
qiskit-aer | 0.8.2 |
qiskit-ignis | 0.6.0 |
qiskit-ibmq-provider | 0.16.0 |
qiskit-aqua | 0.9.4 |
qiskit | 0.29.0 |
qiskit-nature | 0.1.5 |
qiskit-optimization | 0.2.1 |
| System information | |
| Python | 3.8.6 (default, Jan 22 2021, 11:41:28) [GCC 8.4.1 20200928 (Red Hat 8.4.1-1)] |
| OS | Linux |
| CPUs | 192 |
| Memory (Gb) | 6046.015735626221 |
| Mon Aug 09 10:58:39 2021 CEST | |